Skip to content

Commit b175fbc

Browse files
committed
register_dev()をrtmouse_dev_fops.cへ移す
1 parent f6cd192 commit b175fbc

File tree

3 files changed

+119
-102
lines changed

3 files changed

+119
-102
lines changed

src/drivers/rtmouse.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,11 @@ struct rtcnt_device_info {
253253
};
254254

255255
/* --- used in rtmouse_dev_fops.c --- */
256+
extern const char *NAME_DEV[ID_DEV_SIZE];
257+
extern const char *NAME_DEV_U[ID_DEV_SIZE];
258+
extern int _major_dev[ID_DEV_SIZE];
259+
extern int _minor_dev[ID_DEV_SIZE];
260+
extern struct class *class_dev[ID_DEV_SIZE];
256261
extern volatile void __iomem *pwm_base;
257262
extern volatile uint32_t *gpio_base;
258263
extern struct mutex lock;
@@ -261,11 +266,8 @@ extern struct file_operations dev_fops[ID_DEV_SIZE];
261266
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0)
262267
extern struct device *mcp320x_dev;
263268
#endif
264-
265-
int rpi_gpio_function_set(int pin, uint32_t func);
266-
void rpi_gpio_set32(uint32_t mask, uint32_t val);
267-
void rpi_gpio_clear32(uint32_t mask, uint32_t val);
268-
void rpi_pwm_write32(uint32_t offset, uint32_t val);
269+
int buzzer_init(void);
270+
int register_dev(int id_dev);
269271

270272
/* --- used in rtmouse_spi.c --- */
271273
int mcp3204_init(void);
@@ -278,4 +280,10 @@ extern volatile int cdev_index;
278280
int i2c_counter_init(void);
279281
void i2c_counter_exit(void);
280282

283+
/* --- used in rtmouse_gpio.c --- */
284+
int rpi_gpio_function_set(int pin, uint32_t func);
285+
void rpi_gpio_set32(uint32_t mask, uint32_t val);
286+
void rpi_gpio_clear32(uint32_t mask, uint32_t val);
287+
void rpi_pwm_write32(uint32_t offset, uint32_t val);
288+
281289
#endif // RTMOUSE_H

src/drivers/rtmouse_dev_fops.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,24 @@ static ssize_t buzzer_write(struct file *filep, const char __user *buf,
704704
return count;
705705
}
706706

707+
/*
708+
* Initialize buzzer
709+
* return 0 : device close
710+
*/
711+
int buzzer_init(void)
712+
{
713+
714+
rpi_gpio_function_set(BUZZER_BASE, RPI_GPF_OUTPUT); // io is pwm out
715+
rpi_pwm_write32(RPI_PWM_CTRL, 0x00000000);
716+
udelay(1000);
717+
rpi_pwm_write32(RPI_PWM_CTRL, 0x00008181); // PWM1,2 enable
718+
719+
// printk(KERN_DEBUG "%s: rpi_pwm_ctrl:%08X\n", DRIVER_NAME,
720+
// ioread32(pwm_base + RPI_PWM_CTRL));
721+
722+
return 0;
723+
}
724+
707725
/*
708726
* rawmotor_l_write - Output frequency to the left motor
709727
* Write function of /dev/rtmotor_raw_l
@@ -820,3 +838,72 @@ struct file_operations dev_fops[ID_DEV_SIZE] = {
820838
[ID_DEV_CNT].release = i2c_dev_release,
821839
[ID_DEV_CNT].read = rtcnt_read,
822840
[ID_DEV_CNT].write = rtcnt_write};
841+
842+
/* --- Device Driver Registration and Device File Creation --- */
843+
int register_dev(int id_dev)
844+
{
845+
int retval;
846+
dev_t dev;
847+
dev_t devno;
848+
int i;
849+
850+
/* 空いているメジャー番号を使ってメジャー&
851+
マイナー番号をカーネルに登録する */
852+
retval =
853+
alloc_chrdev_region(&dev, /* 結果を格納するdev_t構造体 */
854+
DEV_MINOR, /* ベースマイナー番号 */
855+
NUM_DEV[id_dev], /* デバイスの数 */
856+
NAME_DEV[id_dev] /* デバイスドライバの名前 */
857+
);
858+
859+
if (retval < 0) {
860+
printk(KERN_ERR "alloc_chrdev_region failed.\n");
861+
return retval;
862+
}
863+
_major_dev[id_dev] = MAJOR(dev);
864+
865+
/* デバイスクラスを作成する */
866+
#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)
867+
class_dev[id_dev] = class_create(THIS_MODULE, NAME_DEV[id_dev]);
868+
#else
869+
class_dev[id_dev] = class_create(NAME_DEV[id_dev]);
870+
#endif
871+
872+
if (IS_ERR(class_dev[id_dev])) {
873+
return PTR_ERR(class_dev[id_dev]);
874+
}
875+
876+
for (i = 0; i < NUM_DEV[id_dev]; i++) {
877+
/* デバイスの数だけキャラクタデバイスを登録する */
878+
devno = MKDEV(_major_dev[id_dev], _minor_dev[id_dev] + i);
879+
880+
/* キャラクタデバイスとしてこのモジュールをカーネルに登録する */
881+
cdev_init(&(cdev_array[cdev_index]), &dev_fops[id_dev]);
882+
cdev_array[cdev_index].owner = THIS_MODULE;
883+
if (cdev_add(&(cdev_array[cdev_index]), devno, 1) < 0) {
884+
/* 登録に失敗した */
885+
printk(KERN_ERR "cdev_add failed minor = %d\n",
886+
_minor_dev[id_dev] + i);
887+
} else {
888+
/* デバイスノードの作成 */
889+
struct device *dev_ret;
890+
dev_ret = device_create(class_dev[id_dev], NULL, devno,
891+
NULL, NAME_DEV_U[id_dev],
892+
_minor_dev[id_dev] + i);
893+
894+
/* デバイスファイル作成の可否を判定 */
895+
if (IS_ERR(dev_ret)) {
896+
/* デバイスファイルの作成に失敗した */
897+
printk(KERN_ERR
898+
"device_create failed minor = %d\n",
899+
_minor_dev[id_dev] + i);
900+
/* リソースリークを避けるために登録された状態cdevを削除する
901+
*/
902+
cdev_del(&(cdev_array[cdev_index]));
903+
return PTR_ERR(dev_ret);
904+
}
905+
}
906+
cdev_index++;
907+
}
908+
return 0;
909+
}

src/drivers/rtmouse_main.c

Lines changed: 19 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ const unsigned int NUM_DEV[ID_DEV_SIZE] = {
3838
[ID_DEV_BUZZER] = 1, [ID_DEV_MOTORRAWR] = 1, [ID_DEV_MOTORRAWL] = 1,
3939
[ID_DEV_MOTOREN] = 1, [ID_DEV_MOTOR] = 1, [ID_DEV_CNT] = 2};
4040

41-
/* --- Device Names --- */
42-
static const char *NAME_DEV[ID_DEV_SIZE] = {
41+
/*
42+
* --- Device Names ---
43+
* used in rtmouse_dev.c
44+
*/
45+
const char *NAME_DEV[ID_DEV_SIZE] = {
4346
[ID_DEV_LED] = "rtled",
4447
[ID_DEV_SWITCH] = "rtswitch",
4548
[ID_DEV_SENSOR] = "rtlightsensor",
@@ -49,8 +52,11 @@ static const char *NAME_DEV[ID_DEV_SIZE] = {
4952
[ID_DEV_MOTOREN] = "rtmotoren",
5053
[ID_DEV_MOTOR] = "rtmotor"};
5154

52-
/* --- Device Names(+%u) --- */
53-
static const char *NAME_DEV_U[ID_DEV_SIZE] = {
55+
/*
56+
* --- Device Names(+%u) ---
57+
* used in rtmouse_dev.c
58+
*/
59+
const char *NAME_DEV_U[ID_DEV_SIZE] = {
5460
[ID_DEV_LED] = "rtled%u",
5561
[ID_DEV_SWITCH] = "rtswitch%u",
5662
[ID_DEV_SENSOR] = "rtlightsensor%u",
@@ -60,22 +66,25 @@ static const char *NAME_DEV_U[ID_DEV_SIZE] = {
6066
[ID_DEV_MOTOREN] = "rtmotoren%u",
6167
[ID_DEV_MOTOR] = "rtmotor%u"};
6268

63-
// used in by register_dev() and cleanup_each_dev()
64-
static int _major_dev[ID_DEV_SIZE] = {
69+
// used in by rtmouse_dev.c and cleanup_each_dev()
70+
int _major_dev[ID_DEV_SIZE] = {
6571
[ID_DEV_LED] = DEV_MAJOR, [ID_DEV_SWITCH] = DEV_MAJOR,
6672
[ID_DEV_SENSOR] = DEV_MAJOR, [ID_DEV_BUZZER] = DEV_MAJOR,
6773
[ID_DEV_MOTORRAWR] = DEV_MAJOR, [ID_DEV_MOTORRAWL] = DEV_MAJOR,
6874
[ID_DEV_MOTOREN] = DEV_MAJOR, [ID_DEV_MOTOR] = DEV_MAJOR};
6975

70-
// used in register_dev() and cleanup_each_dev()
71-
static int _minor_dev[ID_DEV_SIZE] = {
76+
// used in rtmouse_dev.c and cleanup_each_dev()
77+
int _minor_dev[ID_DEV_SIZE] = {
7278
[ID_DEV_LED] = DEV_MINOR, [ID_DEV_SWITCH] = DEV_MINOR,
7379
[ID_DEV_SENSOR] = DEV_MINOR, [ID_DEV_BUZZER] = DEV_MINOR,
7480
[ID_DEV_MOTORRAWR] = DEV_MINOR, [ID_DEV_MOTORRAWL] = DEV_MINOR,
7581
[ID_DEV_MOTOREN] = DEV_MINOR, [ID_DEV_MOTOR] = DEV_MINOR};
7682

77-
/* --- General Options --- */
78-
static struct class *class_dev[ID_DEV_SIZE] = {
83+
/*
84+
* --- General Options ---
85+
* used in rtmouse_dev.c
86+
*/
87+
struct class *class_dev[ID_DEV_SIZE] = {
7988
[ID_DEV_LED] = NULL, [ID_DEV_SWITCH] = NULL,
8089
[ID_DEV_SENSOR] = NULL, [ID_DEV_BUZZER] = NULL,
8190
[ID_DEV_MOTORRAWR] = NULL, [ID_DEV_MOTORRAWL] = NULL,
@@ -144,24 +153,6 @@ void rpi_pwm_write32(uint32_t offset, uint32_t val)
144153
iowrite32(val, pwm_base + offset);
145154
}
146155

147-
/*
148-
* Initialize buzzer
149-
* return 0 : device close
150-
*/
151-
static int buzzer_init(void)
152-
{
153-
154-
rpi_gpio_function_set(BUZZER_BASE, RPI_GPF_OUTPUT); // io is pwm out
155-
rpi_pwm_write32(RPI_PWM_CTRL, 0x00000000);
156-
udelay(1000);
157-
rpi_pwm_write32(RPI_PWM_CTRL, 0x00008181); // PWM1,2 enable
158-
159-
// printk(KERN_DEBUG "%s: rpi_pwm_ctrl:%08X\n", DRIVER_NAME,
160-
// ioread32(pwm_base + RPI_PWM_CTRL));
161-
162-
return 0;
163-
}
164-
165156
/* --- GPIO mapping for Device Open/Close --- */
166157
/*
167158
* Get gpio addresses and set them to global variables.
@@ -230,75 +221,6 @@ static int gpio_unmap(void)
230221
return 0;
231222
}
232223

233-
/* --- Device Driver Registration and Device File Creation --- */
234-
static int register_dev(int id_dev)
235-
{
236-
int retval;
237-
dev_t dev;
238-
dev_t devno;
239-
int i;
240-
241-
/* 空いているメジャー番号を使ってメジャー&
242-
マイナー番号をカーネルに登録する */
243-
retval =
244-
alloc_chrdev_region(&dev, /* 結果を格納するdev_t構造体 */
245-
DEV_MINOR, /* ベースマイナー番号 */
246-
NUM_DEV[id_dev], /* デバイスの数 */
247-
NAME_DEV[id_dev] /* デバイスドライバの名前 */
248-
);
249-
250-
if (retval < 0) {
251-
printk(KERN_ERR "alloc_chrdev_region failed.\n");
252-
return retval;
253-
}
254-
_major_dev[id_dev] = MAJOR(dev);
255-
256-
/* デバイスクラスを作成する */
257-
#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)
258-
class_dev[id_dev] = class_create(THIS_MODULE, NAME_DEV[id_dev]);
259-
#else
260-
class_dev[id_dev] = class_create(NAME_DEV[id_dev]);
261-
#endif
262-
263-
if (IS_ERR(class_dev[id_dev])) {
264-
return PTR_ERR(class_dev[id_dev]);
265-
}
266-
267-
for (i = 0; i < NUM_DEV[id_dev]; i++) {
268-
/* デバイスの数だけキャラクタデバイスを登録する */
269-
devno = MKDEV(_major_dev[id_dev], _minor_dev[id_dev] + i);
270-
271-
/* キャラクタデバイスとしてこのモジュールをカーネルに登録する */
272-
cdev_init(&(cdev_array[cdev_index]), &dev_fops[id_dev]);
273-
cdev_array[cdev_index].owner = THIS_MODULE;
274-
if (cdev_add(&(cdev_array[cdev_index]), devno, 1) < 0) {
275-
/* 登録に失敗した */
276-
printk(KERN_ERR "cdev_add failed minor = %d\n",
277-
_minor_dev[id_dev] + i);
278-
} else {
279-
/* デバイスノードの作成 */
280-
struct device *dev_ret;
281-
dev_ret = device_create(class_dev[id_dev], NULL, devno,
282-
NULL, NAME_DEV_U[id_dev],
283-
_minor_dev[id_dev] + i);
284-
285-
/* デバイスファイル作成の可否を判定 */
286-
if (IS_ERR(dev_ret)) {
287-
/* デバイスファイルの作成に失敗した */
288-
printk(KERN_ERR
289-
"device_create failed minor = %d\n",
290-
_minor_dev[id_dev] + i);
291-
/* リソースリークを避けるために登録された状態cdevを削除する
292-
*/
293-
cdev_del(&(cdev_array[cdev_index]));
294-
return PTR_ERR(dev_ret);
295-
}
296-
}
297-
cdev_index++;
298-
}
299-
return 0;
300-
}
301-
302224
/*
303225
* dev_init_module - register driver module
304226
* called by module_init(dev_init_module)

0 commit comments

Comments
 (0)