for(i = 0; i 《 8; i++){
printk(“%d %d ”,i, mybuffer[i]);
writeWord(i + 1, mybuffer[i]);
}
return count;
}
void init(void){
writeWord(0x09, 0x00);
writeWord(0x0a, 0x03);
writeWord(0x0b, 0x07);
writeWord(0x0c, 0x01);
}
//內(nèi)核調(diào)用后的open操作
int open_flag=0;
static int pi_matrix_open(struct inode *inode, struct file *filp)
{
printk(“Open matrix ing! ”);
if(open_flag ==0){
open_flag =1;
printk(“Open matrix success! ”);
return 0;
}
else{
printk(“Matrix has opened! ”);
}
return 0;
}
//內(nèi)核調(diào)用后的release操作
static int pi_matrix_release(struct inode *inode,struct file *file){
printk(“Matrix has release! ”);
return 0;
}
//file_operations使系統(tǒng)的open,write等函數(shù)指針指向我們所寫的led_open等函數(shù),
//這樣系統(tǒng)才能夠調(diào)用
static struct file_operations pi_matrix_dev_fops = {
.owner = THIS_MODULE,
.write = pi_matrix_write,
//.write = write_test,
.open = pi_matrix_open,
.release = pi_matrix_release,
};
static int is_right_chip(struct gpio_chip *chip, void *data)
{
if (strcmp(data, chip-》label) == 0)
return 1;
return 0;
}
//內(nèi)核加載后的初始化函數(shù)。
static int __init pi_matrix_init(void)
{
struct device *dev;
int major; //自動(dòng)分配主設(shè)備號(hào)
major = alloc_chrdev_region(&pi_matrix_devno,0,1,DRIVER_NAME);
cdev_init(&pi_matrix_class_dev, &pi_matrix_dev_fops);
major = cdev_add(&pi_matrix_class_dev,pi_matrix_devno,1);
//注冊(cè)class
pi_matrix_class = class_create(THIS_MODULE,DRIVER_NAME);
dev = device_create(pi_matrix_class, NULL, pi_matrix_devno, NULL, DRIVER_NAME);
//通過這個(gè)函數(shù)把內(nèi)核的GPIO操作和BCM2708的GPIO操作關(guān)聯(lián)起來;
gpiochip = gpiochip_find(“bcm2708_gpio”, is_right_chip);
gpiochip-》direction_output(gpiochip, DIN, 1);
gpiochip-》direction_output(gpiochip, CLK, 1);
gpiochip-》direction_output(gpiochip, CS, 1);
init();
printk(“pi matrix init ok! ”);
return 0;
}
//內(nèi)核卸載后的銷毀函數(shù)
void pi_matrix_exit(void)
{
gpio_free(DIN);
gpio_free(CS);
gpio_free(CLK);
device_destroy(pi_matrix_class,pi_matrix_devno);
class_destroy(pi_matrix_class);
cdev_del(&pi_matrix_class_dev);
unregister_chrdev_region(pi_matrix_devno, 1);
printk(“pi matrix exit ok! ”);
}
module_init(pi_matrix_init);
module_exit(pi_matrix_exit);
MODULE_DESCRIPTION(“Rasp Matrix Driver”);
MODULE_AUTHOR(“HSQ”);
MODULE_LICENSE(“GPL”);
程序效果如下:
使用dmesg命令查看內(nèi)核輸出:
評(píng)論